Обновить

Особенности проксирования через CDN/Websocket/gRPC для обхода блокировок

Уровень сложности Средний
Время на прочтение 15 мин
Количество просмотров 31K

Статья опубликована под лицензией Creative Commons BY-NC-SA.

Эта статья — заключительная (наконец‑то!) из моего огромного цикла про недетектируемые инструменты для обхода блокировок. В предыдущих публикациях я упоминал, что клиенты и серверы XRay (форк V2Ray) и Sing‑box при использовании протоколов VLESS/VMess/Trojan могут работать через веб‑сокеты и gRPC, что позволяет подключаться к даже заблокированным Роскомнадзором прокси‑серверам через CDN (content delivery или content distribution network) и дает дополнительные преимущества. Сегодня мы поговорим об этом поподробнее.

Для чего?

  1. Если ваш прокси‑сервер попал под ковровую блокировку или стал недоступен по еще какой‑то причине, вы по‑прежнему можете достучаться до него через CDN. Вероятность блокировки целого Cloudflare или Gcore CDN гораздо ниже, потому что на них сидит чуть ли не половина всех сайтов Интернета. Даже в Туркменистане, известном своими драконовскими мерами, до недавнего времени люди умудрялись находить незабаненные адреса балансировщиков CF.

  2. Cloudflare умеет проксировать IPv4-запросы на IPv6-адреса. Таким образом, для того, чтобы запустить свой прокси, достаточно купить копеечный IPv6-only‑сервер (с выходом в IPv4-сеть через NAT), который можно найти меньше чем за доллар в месяц.

  3. Проксирование через веб‑сокеты может оказаться эффективным для пробивания через строгие корпоративные системы, которые анализируют весь передаваемый трафик с man‑in‑the‑middle расшифровкой с подменой сертификата.

Нейрокартинка для отвлечения внимания
Нейрокартинка для отвлечения внимания

Протоколы

Первый, самый простой и самый старый протокол — Websocket. Идея простая — клиент отправляет серверу HTTP‑запрос с просьбой переключить подключение в режим веб‑сокетов, и если сервер не возражает, то HTTP‑подключение становится обычной «трубой», по которой можно слать любые данные туда‑сюда. Формат и порядок передаваемых данных стандартом не регламентирован и может быть любой, поэтому CDN в них не вмешивается, а просто пересылает данные с сервера к клиенту и обратно — самое то, для того чтобы использовать подключение как прокси.

Недостатком использования веб‑сокетов является более долгое время установления подключения (кроме TLS‑хендшейка еще должен пройти вебсокет‑хендшейк), и также тот факт, что при большом желании вебсокет‑хендшейк можно детектировать по передавамым объемам данных в начале каждого соединения.

Разработчики проксей придумали решение этой проблемы под названием «early data». Суть его в том, что вместо того, чтобы сначала попросить сервер перейти в режим websockets, а потом слать запросы на прокси, websocket‑хендшейк уже будет содержать какую‑то часть данных, которую мы отправляем на прокси‑сервер — это и сокращает время установления соединения, и рандомизирует размеры пакетов, усложняя детектирование. Если вы используете клиент на базе XRay, то для использования early data нужно добавить «?ed=XXX» в конец пути вебсокет‑адреса, где XXX — максимально допустимый размер данных, которые могут содержаться в первом запросе (в байтах). У меня без проблем работало с "?ed=2048", при каких‑либо ошибках можно попробовать уменьшить значение. XRay всегда использует для этих данных заголовок «Sec‑Websocket‑Protocol», Sing‑box же позволяет использовать любой заголовок, поэтому если вы подключаетесь клиентом на базе Sing‑Box (например Nekobox) к серверу на базе XRay, то нужно явно указывать имя хедера «Sec‑Websocket‑Protocol» в настройках подключения — чуть позже увидите сами.

Другой протокол — это gRPC. Это протокол для межпроцессного и межсервисного взаимодействия от Google, который в качестве транспорта тоже использует HTTP. Он поддерживается не всеми CDN (об этом чуть позже), зато его использование сложнее детектировать, а еще с его помощью можно организовать мультиплексирование (использовать одно и то же TCP‑подключение для множества сессий с прокси). Где‑то тут в комментариях писали, что gRPC более производителен, чем веб‑сокеты, автор Sing‑box наоборот жалуется, что у gRPC‑клиента «poor performance», я же особой разницы не заметил.

CDN

По идее, можно использовать любые CDN, которые поддерживают проксирование websocket и/или gRPC. Среди популярных CDN, которые умеют такое на бесплатных тарифах, известны Cloudflare и Gcore. Расскажу о них по‑подробнее.

Cloudflare — наверное, самая крупная и известная сеть доставки контента в мире (хотя, может быть Akamai и больше, не проверял). На бесплатном тарифе поддерживает как websocket'ы, так и gRPC. Про веб‑сокеты в хелпе сказано, что если вы будете гонять через них очень‑очень‑много данных на бесплатном тарифе, то CF может связаться с вами и попросить начать платить. Я пробовал гонять много данных, пока не попросили. Про gRPC такого требования нет. Еще одна приятная особенность Cloudflare, как я уже говорил выше — это то, что можно иметь сервер, обладающий только IPv6-адресом, и CF будет принимать IPv4-подключения и перенаправлять их на IPv6-адрес.

Одно но — чтобы гонять через нее трафик, нужно, чтобы у вас был домен, и чтобы этот домен был делегирован на ее нейм‑сервера (NS). Регистрируемся в Cloudflare, добавляем там свой домен — CF скажет вам, на какие именно NS его надо делегировать, и это нужно сделать (если не знаете как, запросите инструкции у вашего регистратора доменов или хостинг‑провайдера). Либо же можно сразу купить домен у Cloudflare, цены у них нормальные, но платить, понятное дело, можно только с иностранных банковских карт.

Дальше всё просто:

Идем в DNS → Records, нажимаем «Add record», и добавляетм запись типа A (если у вас IPv4-адрес) или AAAA (если у вас IPv6), указав в Name поддомен или @ для корневого домена, IP‑адрес, и не забыв отметить галочку «Proxied»:

Также нужно не забыть зайти в настройки "Network" для вашего домена в панели CF, и убедиться, что все три самые важные галочки включены:

Конечному клиенту (браузеру или прокси) Cloudflare демонстрирует свой TLS‑сертификат. Подключение между серверами Cloudflare и вашим сервером по‑хорошему тоже должно быть защищено TLS — для этого не обязательно запрашивать домен через Let's Encrypt, можно использовать самоподписанный сертификат (инструкция будет дальше), либо же сгенерировать «внутренний» сертификат от Cloudflare — он подписан другой цепочкой, поэтому в браузере работать нормально не будет, но для связи между балансировщиками CF и вашим хостом подойдет идеально. Настраивается это в разделе SSL/TLS → Overview: режим Full будет работать с самоподписанным сертификатов, а режим Full (Strict) будет требовать наличие «внутреннего» сертификата Cloudflare на вашем сервере:

как сгенерировать "внутренний" сертификат

Идем в SSL/TLS → Origin server. Нажимаем там Create Certificate

Выбираем домены, для которых нужно сгенерить сертификат, нажимаем волшебную кнопочку Create:

И сохраняем полученное содержимое в два файла для дальнейшего использования.

Дальше у нас по списку идет Gcore. Масштабы у них не такие огромные, как у Cloudflare, поддерживаются только веб‑сокеты, gRPC нет, IPv4-to‑IPv6 тоже нет. Но у gCore есть огромное преимущество — для работы через него не обязательно делегировать на него домен, достаточно просто CNAME‑записи — в теории, можно использовать даже DynDNS‑сервисы с бесплатными доменами, которые позволяют указывать CNAME.

Настраивается все следущим образом. Регистрируетесь в Gcore (Gcore Edge Solutions / Gcore Platform), выбираете бесплатный тариф. В панели выбираете слева «CDN», и нажимаете «Create CDN Resource»:

А дальше надо быть внимательным. Предлагаются два варианта: accelerate entire website, и accelerate only static content. Первый вариант, как и в случае с Cloudflare, требует делегирования вашего домена на неймсервера CDN. Поэтомы мы выбираем второй вариант, а именно, accelerate only static content, хоть это и немного контринтуитивно (веб-сокеты на static content все-таки мало тянут, не правда ли?):


Нажимаем Confirm, идем на следущую страницу, и начинаем заполнять:

Origin source — тут нужно ввести IP‑адрес вашего сервера с префиксом https://, например «https://12.34.56.78». Gcore не умеет проксировать IPv6 на IPv4 (у меня отказалась, по крайней мере), поэтому тут нужен уже IPv4-адрес.

Custom domain — тут укажите ваш домен, который вы будете использовать. Не забудьте включить галочку «Enable HTTPS» и выбрать «Get free Let's Encrypt certificate». Нажимаем Confirm чтобы идти дальше. После этого Gcore скажет вам, какое именно значение надо прописать в поле CNAME для вашего домена — это будет какой‑то адрес, скорее всего заканчивающийся на *.gcdn.co:

На следущей странице Gcore попытается нам помочь настроить движок веб‑сайта, выбираем I don't have CMS и идем дальше:

В самом конце не забываем включить поддержку Websocket'ов:

Ииии... готово!
После создания ресурса, нужно еще поменять режим на HTTPS-only:

Настройка серверов и клиентов

Если вы читаете эту статью, то вероятно настраивали сервер XRay по одному из моих мануалов: Обход блокировок: настройка сервера XRay для Shadowsocks-2022 и VLESS с XTLS‑Vision, Websockets и фейковым веб‑сайтом, Bleeding‑edge обход блокировок с полной маскировкой: настраиваем сервер и клиент XRay с XTLS‑Reality быстро и просто, 3X‑UI: Shadowsocks-2022 & XRay (XTLS) сервер с простой настройкой и приятным интерфейсом.

В первом случае, у вас уже настроен XRay‑сервер, который принимает подключения на 443 порт по TLS, у него есть сертификаты, и при этом не используется XTLS‑Reality, домен только свой. Во втором случае используется XTLS‑Reality, то есть сервер маскируется под какой‑то популярный сайт, принимая подключения с SNI его домена, и отдавая его подлинный TLS‑сертификат. В третьем случае возможно и то и то, смотря как настраивали:)

А если вы планируете использовать Cloudflare, и у вашего сервера есть IPv6-адрес, то возможно вообще настроить websocket/gRPC, не трогая основную инсталляцию и не меняя ничего не ней.

И сейчас мы разберем, что же нужно сделать, чтобы иметь возможность работать через CDN и websockets/gRPC для всех этих вариантов.

Во всех случаях нам понадобится установленный на сервер Nginx. Поскольку суть проксирования через CDN — в маскировке под легитимный HTTPS‑трафик, то нам нужен будет веб‑сервер, чтобы хостить какой‑нибудь безобидный сайтик. Плюс к этому, почему‑то в XRay нельзя задать gRPC‑транспорт как fallback, и здесь нам тоже поможет Nginx. Для работы на одном сервере и WS/gRPC, и XTLS‑Reality нужен будет SNI‑прокси, и Nginx тоже умеет работать в этом режиме. Поэтому устанавливаем Nginx.

Обратите внимание, если у вас на сервере стоит Debian или Ubuntu, то нужно устанавливать не просто пакет nginx, а nginx-full, потому что нам потребуются специфические модули Nginx, которые не входят в стандартную поставку (как оно в других дистрибутивах — не знаю, напишите в комментарии).

Также нам понадобится TLS‑сертификат, если у вас его еще нет. Как я уже говорил, при работе через CDN хватит самоподписанного сертификата (все равно его не будет видно снаружи, он используется только для связи между фронтендом CDN и вашим сервером), либо «внутреннего» сертификата от Cloudflare. Инструкцию по получению сертификата от Cloudflare я уже описывал чуть выше, а самоподписанный сертификат можно сгенерировать одной командой вот так:

openssl req -x509 -newkey rsa:4096 -nodes -sha256 -keyout /etc/ssl/private/ssl-cert-snakeoil.key -out /etc/ssl/certs/ssl-cert-snakeoil.pem -days 3650 -subj "/CN=YOUR_DOMAIN_GOES HERE"

Запомните пути к файлам, они вам потом пригодятся.

Далее, для всех трех вариантов нужно будет добавить websocket- и grpc-inbound'ы в конфиг XRay, если их там еще нет. Для всех трех вариантов они будут выглядеть одинаково:

{
        "listen": "127.0.0.1",
        "port": 8888,
        "protocol": "vless",
        "tag": "grpc",
        "settings": {
          "clients": [
            {
              "id": "_UUID_вашего_пользователя"
            }
          ],
          "decryption": "none"
        },
        "streamSettings": {
          "network": "grpc",
          "grpcSettings": {
            "serviceName": "TestChatGRPC"
          }
        }
      },
      {
        "listen": "127.0.0.1",
        "port": 8889,
        "protocol": "vless",
        "tag": "ws",
        "settings": {
          "clients": [
            {
              "id": "_UUID_вашего_пользователя"
            }
          ],
          "decryption": "none"
        },
        "streamSettings": {
          "network": "ws",
          "wsSettings": {
            "path": "TestChatWS"
          }
        }
      },

«TestChatGRPC» и «TestChatWS» должны совпадать с секретными URL'ами, которые мы потом внесем в конфиг Nginx. Лучше не использовать урлы из примера, а придумать свои. Номера портов 8888 и 8889 — тоже должны совпадать с портами, на которые проксирует Nginx (см. дальше).

Если вы используете панель X‑UI или 3X‑UI, то там все аналогично — нужно создать новые inbounds, выбрать тип транспорта grpc или websocket, указать IP‑адрес для входящих подключений 127.0.0.1, соответствующие порты и URL'ы.
Websocket/gRPC на отдельном IPv6-адресе.

Обратите внимание: при подключении через Nginx или CDN, нельзя использовать flow «xtls‑rprx‑vision». Работать не будет.

Приводим конфиг Nginx (например, в /etc/nginx/sites‑enabled/default) к такому виду:

server {
	listen [_тут_ваш_IPv6_адрес]:443 ssl ipv6only=on http2 so_keepalive=on;

    server_name your_domain.com;

    # сюда можно положить какие-нибудь странички фейкового сайта, или использовать proxy_pass чтобы переадресовать запрос на другой сервер
    index index.html;
	root /var/www/html;


    # путь к вашим сертификатам, самоподписанным либо от Cloudflare
	ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
	ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;

	
	client_header_timeout 52w;
    keepalive_timeout 52w;
	# замените TestChatGRPC на какую-нибудь секретную строку
    location /TestChatGRPC {
		if ($content_type !~ "application/grpc") {
			return 404;
		}
		client_max_body_size 0;
		client_body_buffer_size 512k;
		grpc_set_header X-Real-IP $remote_addr;
		client_body_timeout 52w;
		grpc_read_timeout 52w;
		grpc_pass grpc://127.0.0.1:8888;
	}

    # аналогично замените TestChatWS на какую-нибудь другую секретную строку
    location /TestChatWS {
		if ($http_upgrade != "websocket") {
			return 404;
		}
		proxy_pass http://127.0.0.1:8889;
		proxy_redirect off;
	    proxy_http_version 1.1;
	    proxy_set_header Upgrade $http_upgrade;
	    proxy_set_header Connection "upgrade";
	    proxy_set_header Host $host;
	    proxy_set_header X-Real-IP $remote_addr;
	    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	    proxy_read_timeout 52w;
	}
}

Смотрите комментарии к приведенному конфигу — нужно будет указать IPv6-адрес вашего сервера, домен, путь к сертификатам.

Дальше, нужно поменять настройки XRay так, чтобы он прекратил слушать на всех IPv4 и IPv6-адресах, и начал слушать только на одном IPv4-адресе. В конфиге XRay для вашего VLESS‑inbound на 443 порту, добавьте поле "listen": "ваш_ipv4", либо измените его, если оно уже есть. Обратите внимание, что нельзя указывать там «0.0.0.0», пытаясь заставить XRay слушать на всех только IPv4-адресах — он толкует это значение своеобразно и слушает на IPv6 тоже.

Проверяем конфиг Nginx командой «nginx ‑t», если есть ошибки — исправляем, если ошибок нет, то перезапускаем сначала XRay (systemctl restart xray если вы ставили по моим инструкциям), и потом Nginx (systemctl restart nginx). Настройка сервера закончена, можно переходить к настройке клиента (будет описана дальше).

Websocket/gRPC на одном адресе с VLESS XRay на 443 порту без XTLS-Reality

Конфигурация XRay или X‑UI/3X‑UI для этого варианта полностью аналогична предыдущему пункту, только с небольшим дополнением. Для основного VLESS‑inbound необходимо задать fallback, если он не задан, например, на 127.0.0.1:8080. В JSON‑конфиге нужно добавить в секцию «settings» этого inbound'а такое:

"fallbacks": [
               {
                 "dest": 8080
               }
             ]

(внимательно с форматированием, если вы добавили новый параметр в конец секции, предыдущий, уже существовавший, должен иметь запятую в конце, т.к. он более не последний элемент структуры).

В интерфейсе X‑UI/3X‑UI тоже есть опции для задания фоллбэков. Фоллбэк должен быть только один, и URL задавать не надо — мы по умолчанию переадресуем абсолютно все не прощедшие VLESS‑аутентификацию подключения на Nginx.

Далее, приводим тот же конфиг Nginx (например, /etc/nginx/sites‑enabled/default) к такому виду — очень похоже на предыдущий пункт, но есть несколько различий:

server {
	listen 127.0.0.1:8080 so_keepalive=on;

    # тут ваш домен
    server_name your_server_name.com

    # сюда накидать каких-нибудь страничек
	index index.html;
	root /var/www/html;
	
	client_header_timeout 52w;
    keepalive_timeout 52w;
	location /TestChatGRPC {
		if ($content_type !~ "application/grpc") {
			return 404;
		}
		client_max_body_size 0;
		client_body_buffer_size 512k;
		grpc_set_header X-Real-IP $remote_addr;
		client_body_timeout 52w;
		grpc_read_timeout 52w;
		grpc_pass grpc://127.0.0.1:8888;
	}

    location /TestChatWS {
		if ($http_upgrade != "websocket") {
			return 404;
		}
		proxy_pass http://127.0.0.1:8889;
		proxy_redirect off;
	    proxy_http_version 1.1;
	    proxy_set_header Upgrade $http_upgrade;
	    proxy_set_header Connection "upgrade";
	    proxy_set_header Host $host;
	    proxy_set_header X-Real-IP $remote_addr;
	    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	    proxy_read_timeout 52w;
	}
}

Основное отличие — мы слушаем на локалхосте на 8080 порту, и не используем SSL — TLS‑подключение терминируется силами XRay, и в nginx мы получаем уже дешифрованные данные.

Как это работает: входящие подключения от клиентов попадают на XRay, который устанавливает TLS‑соединение. Если клиент аутентифицировал себя как клиент для протокола VLESS «без ничего», то он работает с прокси напрямую. Если нет (например, это браузер, или мы работаем через WS/gRPC) — подключение передается на Nginx, где в зависимости от URL клиенту отдается либо фейковый сайт, либо подключение снова отправляется на XRay, но уже на websocket‑ или grpc‑inbound.

Проверяем конфиг Nginx командой «nginx ‑t», если есть ошибки — исправляем, если ошибок нет, то перезапускаем сначала XRay (systemctl restart xray если вы ставили по моим инструкциям), и потом Nginx (systemctl restart nginx). Настройка сервера закончена, можно переходить к настройке клиента (будет описана дальше).

Websocket/gRPC вместе с XTLS-Reality

Как вы уже знаете из предыдущих статей, суть XTLS‑Reality в том, что прокси‑сервер выдает себя за веб‑сервер какого‑нибудь популярного сайта, переадресовывая все подключения, не прошедшие проверку «свой‑чужой» на него. Поэтому просто так использовать Websocket или gRPC не получится, это ломает всю идею XTLS‑Reality. Но можно использовать хак с SNI‑прокси. Обратите внимание: если у вас на сервере настроен XTLS‑Reality, то через Websocket/gRPC подключаться к нему нужно только через CDN! Иначе для сторонних наблюдаетелей будет немного подозрительно, что на одном и том же IP‑адресе висит сразу и какой‑нибудь microsoft.com, и ваш маленький фейковый никому неизвестный веб‑сайтик.

В первую очередь, редактируем ваш конфиг XRay, сделаем так, чтобы его VLESS/XTLS‑Vision inbound слушал на локалхосте на порту 8443:

"listen": "127.0.0.1",
"port": 8443

Если вы используете X-UI или 3X-UI, там это точно также меняется в настройках inbound'ов.

Далее, настроим Nginx. Конфиг сайта по умолчанию будет похожий на предыдущие варианты, но с небольшими отличиями:

server {
	listen 127.0.0.1:8444 http2 so_keepalive=on;

    # ваш домен
    server_name your_server_domain;

    # сюда накидайте страничек
	index index.html;
	root /var/www/html;


    # путь к сертификатам
	ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
	ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;

	
	client_header_timeout 52w;
    keepalive_timeout 52w;
	location /TestChatGRPC {
		if ($content_type !~ "application/grpc") {
			return 404;
		}
		client_max_body_size 0;
		client_body_buffer_size 512k;
		grpc_set_header X-Real-IP $remote_addr;
		client_body_timeout 52w;
		grpc_read_timeout 52w;
		grpc_pass grpc://127.0.0.1:8888;
	}

    location /TestChatWS {
		if ($http_upgrade != "websocket") {
			return 404;
		}
		proxy_pass http://127.0.0.1:8889;
		proxy_redirect off;
	    proxy_http_version 1.1;
	    proxy_set_header Upgrade $http_upgrade;
	    proxy_set_header Connection "upgrade";
	    proxy_set_header Host $host;
	    proxy_set_header X-Real-IP $remote_addr;
	    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	    proxy_read_timeout 52w;
	}
}

И потом нам надо будет настроить непосредственно SNI proxy, для этого можно использовать тоже Nginx. Одно но — конфиги сайтов из /etc/nginx/sites‑enabled обычно инклудятся в секцию «http» конфига Nginx, а нам нужно настроить секцию «stream», поэтому можно добавить ее прямо в /etc/nginx/nginx.conf:

stream {
  map $ssl_preread_server_name $backend {
      www.microsoft.com        reality;
      your_domain_name         local;
      default                  reality;
  }

  upstream reality {
      server 127.0.0.1:8443;
  }

  upstream local {
      server 127.0.0.1:8444;
  }

  server {
      listen          443 reuseport so_keepalive=on;
      ssl_preread     on;
      proxy_pass      $backend;
  }
}

Тут все просто — сначала идет домен, под который вы маскируетесь с XTLS‑Reality (например, www.microsoft.com), потом идет ваш домен. Подключения c SNI вашего домена Nginx перенаправит на 8444 порт (где обработает его как веб‑сайт, или переадресуется на websocket/grpc‑inbound'ы), а все остальное, включая фейковый домен XTLS‑Reality — на 8443 порт, где слушает XRay.

Проверяем конфиг Nginx командой «nginx ‑t», если есть ошибки — исправляем, если ошибок нет, то перезапускаем сначала XRay (systemctl restart xray если вы ставили по моим инструкциям), и потом Nginx (systemctl restart nginx). Настройка сервера закончена, можно переходить к настройке клиента.

Настройка клиентов

Одинакова для всех трех пунктов. Я просто приведу скриншоты Nekobox, для других клиентов настраивать по аналогии.

Для Websocket:

Для gRPC:

И, понятное дело, значения «Path» должны совпадать с секретными URL'ами, которые вы задали в конфигах Nginx и XRay.

Fair use

Понятное дело, что то, что CDN разрешают на своих бесплатных тарифах проксировать Websockets и gRPC — это такой жест доброй воли от них. Давайте не наглеть и использовать эти возможности только в совсем безвыходных случаях, которые, надеюсь, все‑таки не наступят.

И в заключение

Судя по ныне обсуждаемому законопроекту, запрещающему распространение информации о средствах обхода блокировок, подобному контенту на Хабре жить осталось недолго. Чтобы не потерять — сохраняйте локально копии этой и других статей из цикла и делитесь ими с друзьями и коллегами.

А если есть желание сказать автору спасибо за все его труды — то BTC bc1q6mtfkxj0grqse8cefc4zgw4n9wckpvh5kp3h69

Важно: автор не присутствует в Telegram или каких-либо иных месседжерах или соцсетях, не оказывает никаких платных консультаций и не выполняет никаких работ за деньги, а на вопросы отвечает только на хабре (когда есть время). Остерегайтесь мошенников.

Теги:
Хабы:
Всего голосов 80: ↑78 и ↓2 +76
Комментарии 146
+146
Закрыть

Редакторский дайджест

Присылаем лучшие статьи раз в месяц

Комментарии 146

Закрепленные Закреплённые комментарии

Мне тут пришла в голову еще одна мысль - Nginx не умеет различать HTTP/1.1 и HTTP2 без TLS ALPN. Поэтому по-хорошему, для варианта, когда у вас XRay слушает на 443 порту и терминирует TLS-сессию (без XTLS-Reality и без отдельного IPv6), стоит сделать два fallback'а:

"fallbacks": [
               {
                 "alpn": "h2",
                 "dest": "8081"
               },
               {
                 "dest": "8080"
               }
             ]

и в Nginx в описании сервера должно быть две listen-директивы: llisten 127.0.0.1:8080 so_keepalive=on; listen 127.0.0.1:8081 http2 so_keepalive=on;

Тогда сервер будет корректно отвечать и на HTTP/2-запросы.

Важно: автор не присутствует в Telegram или каких-либо иных месседжерах или соцсетях, не оказывает никаких платных консультаций и не выполняет никаких работ за деньги, а на вопросы отвечает только на хабре (когда есть время). Остерегайтесь мошенников.

если у вас на сервере стоит Debian или Ubuntu, то нужно устанавливать не просто пакет nginx, а nginx-full, потому что нам потребуются специфические модули Nginx, которые не входят в стандартную поставку

Если подключена репа от разработчиков, то годится пакет nginx.

Сначала спасибо за серию статей. Очень помогли. Всё поставилось и работает.

Возник вопрос есть ли простой способ настроить subscription на правила для клиента? Например панель hiddify после сканирования qr-кода для подписки в Shadowrocket в разделе Config добавляет конфиг и можно его обновлять. Но там в панели не реализовано редактирование правил.

Хочется такое для знакомых, которые не поймут как на клиенте добавлять заумные правила.

Возник вопрос есть ли простой способ настроить subscription на правила для клиента

Увы, но нет. Насколько я знаю, пока что не существует механизма подписки на правила.

Жаль что нет чего-то простого и автоматизированного.

Нашел пример как это реализовать: https://mishatugushev.ru/blog/?go=all/shadowrocket-ios-wireguard/. Правда не понял пока автоматически правила обновляются или нет.

Сделал себе что-то похожее.

Автоматически правила не обновляются. Только в ручном режиме, через функцию "Update config".

Интересно, а если в правиле указать url, типо

RULE-SET,{URL},PROXY

то подтягиваются ли правила из этого url периодически?

В момент запроса правило сканирует адрес и возвращает ответ если запрос соответствует паттерну, иначе пропускает.

иногда кажется что проще (нет) переместить себя за пределы цензуры чем насроить всё енто дело

Если все это слишком сложно - то советую Amnezia VPN, он устанавливается на любой сервер двумя кликами в понятном интерфейсе, есть клиенты под все платформы, и они тоже работают над защитой от выявления и блокирования протоколов.

Но совет насчёт перемещения себя очень правильный.

А для sing-box какие конфиги должны быть ?

Для sing-box то же самое, только формат отличается немного.

Как-то так
{
      "tag": "vless-ws",
      "type": "vless",
      "listen": "127.0.0.1",
      "listen_port": 8889,
      "transport": {
        "type": "ws",
        "path": "/TestChatWS"
      },
      "users": [
        {
          "name": "test",
          "uuid": "xxx"
        }
      ]
    },
    {
      "tag": "vless-grpc",
      "type": "vless",
      "listen": "127.0.0.1",
      "listen_port": 8888,
      "transport": {
        "type": "grpc",
        "service_name": "TestChatGRPC",
        "idle_timeout": "15s",
        "ping_timeout": "15s",
        "permit_without_stream": false
      },
      "users": [
        {
          "name": "test",
          "alterId": 0,
          "uuid": "xxx"
        }
      ]
    }

Мне тут пришла в голову еще одна мысль - Nginx не умеет различать HTTP/1.1 и HTTP2 без TLS ALPN. Поэтому по-хорошему, для варианта, когда у вас XRay слушает на 443 порту и терминирует TLS-сессию (без XTLS-Reality и без отдельного IPv6), стоит сделать два fallback'а:

"fallbacks": [
               {
                 "alpn": "h2",
                 "dest": "8081"
               },
               {
                 "dest": "8080"
               }
             ]

и в Nginx в описании сервера должно быть две listen-директивы: llisten 127.0.0.1:8080 so_keepalive=on; listen 127.0.0.1:8081 http2 so_keepalive=on;

Тогда сервер будет корректно отвечать и на HTTP/2-запросы.

Спасибо вам за весь курс статей! Добавьте пожалуйста usdt trc20 для донатов! На многих кошельках комиссия за send to btc страшенная.

Насколько использование cdnа подрезает скорость ?

У меня 30-40 мегабит выдавало без проблем (подключался через телефон, возможно по кабелю выдало бы и больше). Опять же, нужно иметь в виду, что это именно что backup plan, не для каждодневного использования - уже не важно, насколько быстро, там бы хоть что-то работало без блокировок.

Теперь это надо выкладывать в виде PFD чтобы удобно было сохранять до прихода надзора.

Два вопроса по поводу Nekobox:


  1. Как открыть/пробросить порт? Так и не удалось разобраться.
  2. При каждом включении режима "TUN" (он же "VPN") программа подряд трижды (!) требует ввести пароль админа — для установки DNS, доменов и маршрутизации. Дико раздражает делать это каждый раз при включении/переключении серверов. Как отключить требование пароля? Речь о версии под Linux.

Как открыть/пробросить порт?

Что конкретно имеется в виду? Функционал reverse proxy? В Sing-box его вообще нету, и поэтому в интерфейсе Nekobox настроек для него тоже нет. В XRay (Nekobox теперь умеет его использовать как ядро), в теории можно настроить через Nekobox кастомные JSON-поля для клиента, но там все настолько по-наркомански замудрено, что без бутылки не разобраться, и кажется оно требуется настройки сразу и со стороны клиента, и со стороны сервера.

 Как отключить требование пароля? Речь о версии под Linux.

TUN-режим требует поднятия нового сетевого интерфейса и установки маршрутов, для этого нужны рутовые права. Как решение - запускать Nekobox сразу от имени рута, тогда спрашивать не должен.

Что конкретно имеется в виду?

Имеется ввиду следующее. Некоторые программы требуют для внешних соединений открытый порт (port forwarding). Обычно это настраивается на роутере, в случае VPN — в панели управления VPN. А вот где это настраивается в Nekobox я не могу понять. Грубо говоря, мне надо, чтобы на сайте проверки открытости порта вроде portchecker.co для соответствующего порта было написано "открыто".


Как решение — запускать Nekobox сразу от имени рута, тогда спрашивать не должен.

А как это настроить? У меня Nekobox запускается автоматически вместе с системой.

я как понимаю tun мод создает новый интерфейс на устройстве но не на сервере, таким образом можно взаимодействовать между устройствами( пинговать, подключаться по ssh ). Или я не совсем правильно понимаю как это работает ?

Tun создает устройство на клиенте, но все пакеты, которые попадают на него, заворачиваются на прокси. Shadowsocks, VMess, VLESS, Trojan поддерживают только обычные TCP и UDP в одну сторону. Поэтому клиенты друг друга не видят вообще, пинговать по ICMP не получится вообще (только UDP-пинг, если повезет), пробразывать порты в обратную сторону тоже очень сложно.

какая тогда практическая польза tun мода, если никакой общей сети создаётся?

Заворачивание на прокси трафика от приложений, которые не умеют или не хотят работать через прокси.

А если использовать системный прокси, тоесть весь трафик передавать, эти приложения тоже не будут работать ?

Да, такое часто бывает. "Системный прокси" устанавливает настройку в системе, а вот использовать эту настройку или нет - это уже дело самого приложения. Приличные программы эту настройку уважают и используют (например браузеры), но многие вообще не умеют подключаться через прокси. Для них и спасает Tun-режим.

Спасибо за разъяснение

Как думаете, блокировки коснутся ipv6?

Уже.

Серьезно взялись.

Спасибо огромное за статьи! Очень полезная и актуальная тема.

UPD: Кстати, было бы интересно если бы вы также смогли дать краткое описание и пример настройки функционала xray bridge для тех кому нужен функционал реверс прокси и прокидывания доступа из внешней сети к домашней

Я один раз пробовал почитать документацию и понять как такое настроить - ниасилил, там без бутылки не разобраться. Может быть когда-нибудь потом... А пока лучше просто использовать в качестве реакос-прокси SSH-туннель с авторизацией по ключам и автопереподнятием с autossh. А если вдруг забанят, то SSH всегда можно пустить через XRay :)

Upd: вроде разобрался, ничего прям сложного на самом деле нет, хотя кажется в примерах в документации упущено несколько моментов. Нужно будет в любом случае потестировать, перед тем как писать статью, пока на это времени совсем нет :(

Большое спасибо за цикл статей! Блягодаря этой статье наконец таки осилин СDN ;) Смог настроить ss,vless-tls+cdn, vless reality но на свой локальный хост.

Пока не могу разобраться только с одним моментом: Пытаюсь настроить Reality на сторонний сайт и получаю такой результат: с камими то сайтам все работает, но если в браузере ввожу свой домен то вместо переадресами на сторойнний сайт получаю: Invalid URL The requested URL "[no URL]", is invalid. Такое например если указываю в качестве dest www.microsoft.com:443, Server Names: www.microsoft.com. Бывает другой результат. Например, ессли в качестве dest указать mwomercs.com:443б а в качестве Server Names mwomercs.com, то при заходе на свой сайт получаю страницу поддельного, НО прокся перестает соединяться. Во всех описанных вариантах Google Chrome выдает в строке адреса что сертификат недействительный (ну тут наверное логично, т.к. адрес мой, а самое содержимае не мое). Но блин, никак не могу сделать так, чтобы и сайт открывался и соединение станавливалось :(

Ну вроде все нормально. XTLS-Reality работает так: когда сервер не опознает клиента как валидного клиента прокси, он передает подключение на какой-нибудь другой веб-сервер. Поскольку запрос из браузера у вас идет по вашему домену, то есть в SNI и хедере Host фигурирует не www.microsoft.com, а ваш домен, то сервер Microsoft очень удивляется и говорит "что за фигня, ваш URL типа invalid".

Еслиесть желание проверить как надо, добавьте IP-адрес вашего сервера и домен, под который вы маскируетесь, в hosts-файл (на Linux это /etc/hosts, на Windows это c:\windows\system32\drivers\etc\hosts), например, "38.25.63.10 www.microsoft.com", и после этого попробуйте зайти на этот адрес браузером - должна открыться настоящая страница этого домена с настоящим TLS-сертификатом.

Другой вариант: использовать CURL.curl -v --resolve www.microsoft.com:443:151.101.65.69 https://www.microsoft.com (вместо 151.101.xx.xx должен быть IP вашего сервера)

Спасибо большое за ответ. Да, вы правы, все так и есть как вы описали. В данный момент все таки нашел сайт который и открывается и прокся работает как надо. .без изменения hosts. Но это была уже наверное 30-я моя попытка :)

Щас задумываюсь найти какой нибудь сайтик из адресного пространства моей vps, тогда вообще все клево должно получиться. Единственное не знаю какой еще порт можно настроить. Для ss выделил рандомный. Vless+ ttl + cdn (по второму пункту этой инструкции) на 443 сделал, а вот какой порт сделать для vless + reality что б это все хоть чуть чуть было похоже на правду не понятно, т.к. 443 занят.

И еще вопросик. Тестировал все типы соединения (пропускал openvpn внутри прокси), наименьший пинг(с разницей несколько мс) получается с ss проксей. Но клиент(NekoRay) на ss соединение пишет что ttl выключено. Это норм? Ss не использует ttl?

P.s. и еше одно уточнение для ваших инструкций, долго очень искал решения проблемы, везде в xray и в веб панели 3x-ui надо скармливать не файл сертификата, а fullchain.

а вот какой порт сделать для vless + reality что б это все хоть чуть чуть было похоже на правду не понятно, т.к. 443 занят.

ну вообще основная идетя Reality именно в том, что оно должно висеть именно на 443 порту как самый обычный сайт.

Если у вас там уже висит какой-то реальный сайт, то можно провернуть штуку с IPv6 или SNI-прокси, но тогда уже этот "реальный сайт" должен раздаваться только через CDN.

Или еще один вариант - маскироваться под что-нибудь типа IMAPS. По-полной, 993 порт, в качестве фейка - IMAPS сервер какого-нибудь почтовика, а от клиента подключения обязательно с ALPN "imap" (или imaps, точно не помню, надо в гугле проверить)

О, точно, это супер идея, спасибо, замаскирую по почтовик ;)

443 порт у меня занят связкой vless-tls с локальной заглушкой + CDN(второй вариант этой вашей инструкции), мне такой вариант как то больше понравился чем делать по 3-тьеуму варианту reality+cdn.

сделал на 443 порту и vless-reality, и свой маленький реальный сайт, всё работает, но, возможно, детектируется:

stream {

map $ssl_preread_server_name $sni_name {
	www.microsoft.com  reality;
    mywebsite.com      mywebsite;
    www.mywebsite.com  mywebsite;
    default            reality;
}

upstream mywebsite {
	server 127.0.0.1:1443;
}

upstream reality {
    server 127.0.0.1:2443;
}

server {
    listen          443 reuseport;
    proxy_pass      $sni_name;
    ssl_preread     on;
}

}

а также: держу на одном сервере outline (это shadowsocks), а также xray-reality и xray-shadowsocks. Почти всё работает ок, но google.com (почта, карты - ок) возвращает 403, если пользоваться клиентами foxray или shadowrocket (всё на iphone) и любым из трех прокси (их можно настроить, в том числе, чтобы работали с outline-сервером). с outline-клиента с outline-сервером гугл тоже ок, вот такая вот загадка

google.com (почта, карты - ок) возвращает 403

Отключите IPv6 в настройках клиента, и все будет с Гуглом нормально. В Outline он, видимо, по умолчанию отключен, либо там tun-режим реализован чуть-чуть другим образом.

Я с ними не особо знаком, но если кто-нибудь опубликует, я не буду возражать.
Все статьи опубликованы под лицензией Creative Commons BY‑NC‑SA.

Спасибо вам за гайды. К сожалению новичок, в нужной ветке не могу отписать, задам вопрос по XLTS здесь.

Настроил XLTS Reality через X-ui панель по вашему гайду. Все работает. Но с настройками на клиенте возникла странная трабла. Клиент nekoray для android. На сервере отключил блокировку ру подключений. Установил правила маршрутизации обход для нужных приложений, обход по geoip:ru и обход по domain:ru. И вот с последним возникает странная ситуация.
1. прокси выключено. Все ру сайты открываются, 2ip.ru выдает русский ip.
2. включаем прокси и включаем правило по домену. Часть ру сайтов открывается (пикабу например), часть перестает (не работает яндекс, zzap.ru возможно еще какие то). при этом 2ip.ru открывается и выдает русский ip.
3. включаем прокси но выключаем правило по домену. Все ру сайты открываются, 2ip.ru открывается и выдает ip адрес VPS.

Что это может быть и как попробовать бороться? Понимаю что простым решением будет выключить прямой маршрут до ру сегмента, но хотелось бы большей устойчивости, а как понял из ваших статей, такой вариант допускает блокировку vps сервера по "косвенным" данным

Что это может быть и как попробовать бороться? 

Нужно проверить, что стоит в клиенте в Settings опция Enable Traffic Sniffing в значение Sniff for Routing, можно еще попробовать включить Resolve Destination. В самом (не-андроидном) sing-box вместо domain:ru должно быть domain_suffix:ru, но андроидный Nekobox кажется так не дает такой опции. Под android можно v2rayNG попробовать, он кажется подобное умел.

такой вариант допускает блокировку vps сервера по "косвенным" данным

в России цензоры пока такое не умеют, да и не факт, что быстро научатся. в Китае, судя по тому как там популярны такие опции, видимо что-то подобное делают.

включить Resolve Destination

Отлично, помогло!

вместо domain:ru должно быть domain_suffix:ru

Про domain:ru прочитал где то в гайдах, когда искал решение. Только что перепроверил. Если выключить маршрут domain:ru то 2ip.ru выдает ip адрес VDS. Если включить, то выдает ip из россии. Так что видимо работает?

пока такое не умеют

Ну мы им помогать статистикой тоже не будем

Так что видимо работает?

видимо да :)

Установил 3X-UI. С сертификатами настроил подключения она работают. Но при включении proxy через Cloudflire подключения перестают работать.

Так просто не сказать, нужно смотреть какая именно конфигурация, что видно в логах клиента и сервера. Если работал вариант с простым VLESS (без Reality), то, например, частой ошибкой при попытке использования CDN бывает то, что люди забывают отключить xtls-rprx-vision при этом. Поскольку CDN перешифровывает у себя трафик, то с включенным Vision (со стороны сервера или клиента), естественно, работать ничего не будет.

Пробовал разные конфигурации SS, VLESS ничего не работает. При тестировании в Nekobox ошибка. C телефона тоже не работает.

Hidden text
INFO[0000] outbound/vless[proxy]: outbound connection to cp.cloudflare.com:80
INFO[0000] outbound/direct[direct]: outbound packet connection to 192.168.183.2:53
[[VLESS] Test1346-57gz502w] ошибка теста: Get "http://cp.cloudflare.com/": context deadline exceeded

Hidden text

У вас в панели настроен голый VLESS на каком-то странном порту вообще без какого-либо шифрования - все данные передаются в открытом виде, а еще можно элементарно детектировать протокол, перехватить ваш UUID и использовать его в своих целях.

Это точно то, что вы хотели достичь настройкой?

Перепутал файл

Hidden text

Все равно не понятно - у вас на скриншоте конфигурация XTLS-Reality. Reality не работает через CDN.

Благодарю за супер-подробный контент по обходу блокировок от РКН, отправил вам "на чай" донат.

Есть небольшой вопрос: а можно ли ставить outline на тот же сервер, что и shadowsocks/VLESS? Чисто технически — можно, я проверял, все работает. Но вопрос именно в безопасности и скрытности. Я в этом пока что лузер, хотел ответ от профессионала получить)

Спасибо!

Outline, если я правильно помню, основан тоже на ShadowSocks, там что по идее особо разницы не должно быть

на одном из компов обновил клиент Nekobox. Сразу перестало конектится по SS - пишет что неправильная длинна ключа. "Bad key length, required 16 , got 24" А ключ я не менял и на других компах где не обновлялся Nekoray - там все работает с теми же ключами? Кто сталкивался?

Было то же самое, это зависит не сколько от самого Nekobox, сколько от Sing-box, который там в качестве движка. Я особо не вникал, что они там поменяли, оказалось проще перегенерировать ключи с openssl rand -hex 16 (для 128-битного протокола) или -hex 32 (для 256-битного)

вчера - пока экспериментировал всяко с копированием ключей ) - периодически выскакивали ошибки про неправильный формат base64 . Потому сгенерировал новые ключи " openssl rand -base64 16 " - и все заработало.

Да, точно, перепутал, hex это для shortId, а для ключей лучше подойдет Base64 (хотя в принципе любой hex нужно длины для этого случая будет валидным base64)

Слушай а ты вкусе что в телеграмме сидит мошенник пол твоим никнеймом

Ну вижу. Написал в саппорт, но не думаю, что они что-то сделают. Добавил предупреждение в статьи. Разговаривать с подобными мерзавцами не имею ни малейшего желания. Пусть сдохнет от рака яичек.

Важно: автор не присутствует в Telegram или каких-либо иных месседжерах или соцсетях, не оказывает никаких платных консультаций и не выполняет никаких работ за деньги, а на вопросы отвечает только на хабре (когда есть время). Остерегайтесь мошенников.

Добрый день! Благодарю за прекрасные и простые гайды, настроил по вашему гайду https://habr.com/ru/articles/731608/ себе впн, всё вроде работает за исключением пары моментов. К тому поступ комментарии мне оставить не даёт, поэтому пишу сюда.

рабочий впн работает через опенвпн протокол, и вот как только я включаю v2box VLESS свой впн, у меня начинается реконнект к опенвпн рабочему, и переподключения так и не происходит. Может быть вы могли бы подсказать как мне подиагностировать эту проблему? или может это вообще не будет вместе работать VLESS и OpenVPN?
Я пробовал в настройках роутинга сделать direct доступ до сервера рабочего впн, пробовал по домену сделать direct доступ, всё никак.

Еще момент, что у меня сделана настройка роутинга для RU доменов direct доступ, следующим образом
Еще момент, что у меня сделана настройка роутинга для RU доменов direct доступ, следующим образом

Но почему-то у меня при входе в госуслуги появляется плашка что "вы похоже используете впн" но всё вроде работает, и емиас и госуслуги, не работает только мобильное приложение газпромнефти.
Это я что-то настроил не так? или как они могут вообще это отслеживать?

Я пробовал в настройках роутинга сделать direct доступ до сервера рабочего впн, пробовал по домену сделать direct доступ, всё никак.

Если есть желание запустить VPN через прокси, то все зависит от того, какой именно протокол используется у вас для корпоративного VPN, он может работать и через UDP, и через TCP. Проксировать TCP проблем быть не должно, с UDP могут быть проблемы.

Но всегда можно добавить нужные домены/адреса в исключения, чтобы подключение к VPN шло напрямую в обход прокси. Почему у вас не работает - не знаю, я не имел дела с v2box. Нужно смотреть, как конкретно настраиваются правила маршрутов в v2box, и какой конфиг он в итоге генерирует из них.

 или как они могут вообще это отслеживать?

Если это мобильное устройство, то банковское (или любое другое приложение) может смотреть, активен ли в системе VPN-интерфейс, либо сравнивать геолокацию устройстваи локацию по IP-адресу.. Некоторые особо тупые российские сервисы по умолчанию считают что "любой доступ из-за рубежа - значит включен VPN". И еще некоторые сервисы (типа Open AI) по умолчанию запрещаюь доступ с non-residental IP-адресов (то есть 99.9% VPS-хостеров).

У Вас есть догадки каким способом передается UUID во время инициализации-аутентификации клиента с прокси сервером ? Нужно со стороны VLESS прокси ограничить доступ на кол-во одновременных подключений к одной конфигурации. Если со стороны nginx добавить конфигурацию grpc_set_header X-Real-IP $http_cf_connecting_ip то CDN CF передает реальные ip адреса клиентов Nginx и в панели 3x-ui в ip log видны они, далее fail2ban считывает логи и происходит бан 2 адреса (в случае если ограничение выставлено на 1 ip), но доступ по не понятным мне причинам у 2 клиента остаётся, хотя к другим конфигурациям ss, reality доступа в этот момент уже нет. Насколько понял ограничивать нужно со стороны FW CDN CF ?

У Вас есть догадки каким способом передается UUID во время инициализации-аутентификации клиента с прокси сервером?

Протокол описан в открытом доступе: https://xtls.github.io/Xray-docs-next/en/development/protocols/vless.html

Нужно со стороны VLESS прокси ограничить доступ на кол-во одновременных подключений к одной конфигурации. 

Не представляю, как это сделать, чтобы работало нормально. В отличие от классических VPN, где между клиентом и серверов устанавливается только одно TCP-подключение, прокси работают по-другому - на каждое TCP-подключение от браузера (или другого приложения) к какому-либо серверу, будет создаваться новое TCP-подключение к прокси. При открытии любого более-менее сложного сайта, даже один браузер с одной вкладкой может одновременно открывать десятки параллельных подключений, что в свою очередь выльется в десятки подключений к прокси. Поэтому если вы ограничите количество одновременных подключений к одной конигурации, есть риск что пользователи будут наблюдать разные побочные эффекты, вплоть до полной невозможности серфить через прокси (даже когда пользователь только один).

Я немного имел в виду другое, нужно ограничить доступ с разных ip адресов к одному конфигу, чтобы например только устройства с 2 разными адресами могли одновременно пользоваться, а при подключении 3 ip соединения сбрасывалось, с shadowsocks, reality и другими реализация с баном через fail2ban работает, но з CDN по понятным причинам нет. И мыслей как это реализовать з CDN у меня также нет. Если бы UUID как то передавался во время аутентификации, чтобы можно было указать правило на стороне CDN что при запросе с таким-то UUID пропускать запросы только с 1 ip, остальные сбрасывать, но он передается в зашифрованном виде и поэтому никак.

Я немного имел в виду другое, нужно ограничить доступ с разных ip адресов к одному конфигу

Ну я так и понял. Даже если сделать такое ограничение, есть куча случаев, когда оно работать не будет - например, когда оба разных клиента сидят за одним NAT'ом мобильного оператора.

далее fail2ban считывает логи и происходит бан 2 адреса

Тут надо смотреть, как именно fail2ban делает бан. Вполне вероятно, что он анализирует логи прокси, видит там настоящий IP-адрес клиента (из хедера), и ставит на него бан в системном фаерволе - но фаервол-то видит только адреса балансеров Cloudflare, и поэтому бан не срабатывает. В этом случае нужно смотреть или в сторону бана на уровне nginx (https://github.com/fail2ban/fail2ban/blob/master/config/action.d/nginx-block-map.conf, https://dplab.medium.com/rate-limiting-with-fail2ban-and-nginx-part-ii-1b8c92fa7f7) или в сторону бана на уровне iptables по содержимому заголовка (actionban = iptables -I fail2ban- 1 -p tcp --dport 80 -m string --algo bm --string 'X-Forwarded-For: ' -j DROP). Ну либо дергать какой-то API Cloudflare для блокировки конкретного адреса, если у них такой есть.

Спасибо за развернутый ответ.

Спасибо!!!!!!!!! Очень актуально!

С октября 2019 настраивал Shadowsocks через Cloudflare CDN по известной статье на Overlockers (автор vanyaindigo) - других вменяемых мануалов тогда не было. Последнее обновление его статьи от июля прошлого года - устарело, но работало. Там используется устаревший и необновляемый shadowsocks-libev... .

Уважаемый, а представьте пожалуйста себе на минутку, что вы намерены использовать 3xui с одной единственной конфигурацией, а именно vless ws tls cdn на 443 порту разумеется.

У вас есть парочка доменов подключенных к скажем к gcore, через которые вы и проксируете соединение.

В этом случае, получается что вы подключаетесь к серверу через sni, в котором фигурируют ваши домены. Для цензора это выглядит так, будто вы регулярно устанавливаете соединения с неким сайтом.

Разумеется, через некоторое время, он также заинтересуется посетить ваши домены под видом браузера и выяснить что к чему.

А значит надо установить nginx, и запустить камуфляжный сайт на оном, чтобы вводить цензора в заблуждение.

Так каковой должна быть конструкция nginx ,именно для этого случая, учитывая также что опция fallback здесь невозможна, бо для нее нужен tcp, в то время как у нас исключительно websocket transport.

Это вариант номер 1, описанный в статье. Подключение принимает Nginx, отдает фейковый веб-сайт, а если URL совпал с секретным-вебсокетным, то передает подключение на XRay.

Окей, взгляните, в той первой вашей конфигурации nginx, если мне нужен только ipv4 что написать вверху: ipv4only=on?

Также, если пользую больше одного домена, как их добавлять там?

А также в колонке location для vless ws , так как он у меня с tls и cdn на 443м, как правильно заполнить тута?

proxy_pass http://127.0.0.1:

если мне нужен только ipv4 что написать вверху: ipv4only=on?

Нет такой опции. Просто написать listen и конкретный IPv4-вдрес на котором надо слушать, либо 0.0.0.0 если надо на всех (включая локалхост).

Также, если пользую больше одного домена, как их добавлять там?

server_name domain1 domain2 domain3;

А также в колонке location для vless ws , так как он у меня с tls и cdn на 443м, как правильно заполнить тута?

Вы определитесь сначала, какую вы вообще схему хотите сделать - кто должен слушать на 443 порту вашего адреса и терминировать сессию - Nginx или Xray? И то и то одновременно не получится. От этого зависит все остальное. Если у вас Xray слушает на 443 порту и терминирует сессию, то Nginx для вебсокетов вам вообще не нужен, только для фейкового веб-сайта, и location в его конфиге не нужен тоже. Если у вас слушает Nginx, то в нем должен быть настроен TLS, и в proxy_pass там должен быть адрес и порт, на котором слушает ws-inbound в Xray (естественно без TLS, и чистый VLESS работать тоже не будет, только через вебсокеты)

Вы определитесь сначала, какую вы вообще схему хотите сделать - кто должен слушать на 443 порту вашего адреса и терминировать сессию - Nginx или Xray? И то и то одновременно не получится. От этого зависит все остальное. Если у вас Xray слушает на 443 порту и терминирует сессию, то Nginx для вебсокетов вам вообще не нужен

Так я и описал свою схему во вчерашнем посту, уважаемый, вы уж простите за такую нубовость

Значит мне nginx и нужен лишь для камуфляжа моих cdn доменов, чтобы подсунуть цензору полноценный веб-сайт при проверке оных, вот это то я и ищу тщетно

Попытаюсь набросать конфиг nginx для такого варианта, исходя из того, насколько я понял ваши инструкции, а вы пожалуйста направьте в верное русло если что.

Конфиг Xray в Xui в то же время: vless ws tls на 443 порту, сертификаты для доменов с помощью certbot , и указаны fullchain пути к ним.

server {
    listen 0.0.0.0:80 default_server
        
    server_name mysite1.com mysite2.net
        
     location/{ 
              proxy_pass https:bing.com
     }

}

Ну конечно я понимаю, что тут полная лажа🤦😰

Ага. Теперь надо проверить, чтобы в панели у WS inbound'а был fallback на 127.0.0.1:80 где слушает Nginx. Я так не пробовал, но должно сработать. Если не сработает, то придется сделать чуть сложнее: на 443 порту с TLS будет простой VLESS (даже если им пользоваться не планируете), а у него два fallback'a: один с секретным урлом на vless-ws, а другой для всего остального на Nginx.

Конфиг Nginx в целом ок, только неправильный синтаксис у proxy_pass, не хватает слешей после протокола.

Как считаете, будет хорошей маскировкой поднятый на VPS nextcloud и установка его в качестве фейкового веб-сайта?

Нормально. Я сам так делал.

От белых списков не спасет, но в остальном очень даже норм вариант.

А как быть с тем, что и для nextcloud и для xray надо 443 порт?

Нужно перевесить nextcloud на другой порт и заставить его слушать только на 127.0.0.1

А как это сделать, nextcloud устанавливал по вашей статье из контейнера, где искать настройку?

Отредактировать docker-compose файл: для контейнера proxy в секции ports поменять 443:443 на что-то типа 127.0.0.1:8443:443.

Потом надо будет пересоздать контейнер proxy.

И в настройках Xray для Reality указать dest 127.0.0.1:8443

Все получилось, спасибо! Нормальный вариант выходит, не надо microsoft, не надо сайта с кошечками, облако - качай сколько хочешь, подозрений быть не должно. Наверное можно и к статье добавить. Еще вопрос, у nekorаy есть варианты запуска из командной строки, чтобы, GUI глаза не мозолил или можно было запускать из голого линукса, без графической оболочки?

У Nekoray нет, его смысл именно в интерфейсе. Но всегда можно использовать голый Xray или Sing-Box, они как раз используются в основе Nekoray и они консольные. Им нужен JSON-конфиг, его можно сгенерить руками или тем же Nekoray.

Нет ли простейшего варианта, чтобы ненужное не устанавливать на слабенький VPS? А-ля статичная страничка с формой авторизации (типа первой страницы Netbox), но с обработкой ввода (всегда выдает другую, с ошибкой авторизации).

Наверное, можно в Nginx прописать в качестве фейковой страницы свой netbox на другой машинке (я все в кубере держу, но на ноду кубера ставить эту прелесть вряд ли стоит). Видимо тогда имя хоста придется на nginx подменять (ведь на него придет с "левым" FQDN, который через CloudFlare, а на netbox надо его родной отдать, чтобы без редиректов обойтись).

Тогда получается, вообще любой чужой сайт можно поставить в качестве "обманки"?

В nginx есть опция proxy_pass, чтобы переадресовывать запросы на другой хост. И там же при необходимости можно модифицировать содержимое хедеров.

Вот есть вариант файла default, из известной статьи "Настройка VPN на основе Shadowsocks через Cloudflare CDN".
Там используется именно опция "proxy_pass", чтобы переадресовывать запросы на любой известный сайт, в том случае на youtube.

Видимо, можно взять данный файл за основу. И не нужно никаких фейковых сайтов на свой VPS вешать.
Планирую сделать именно так.
А вот, какие настройки менять и как подгонять под вариант описанный в данной статье - кто-то из Гуру может подскажет?

В случае использования proxy_pass, лучше переадресовываться не на какой-нибудь известный сайт, а на какой-нибудь малоизвестный. Потому что будет очень подозрительно когда выяснится, что по вашему ноунейм-домену отвечает Ютуб, да ещё и к тому же через Cloudflare.

А так, метод тот же самый, что и в упомянутой вами статье. Добавляете в конфиг "location /" (он должен идти в самом конце после других location-ов), и в нем объявляете proxy_pass.

Странно, у меня не работает редирект. При введении моего домена в браузере - выскакивает ошибка.
Приложил файл default.
Вроде всё просто... . Но!

Cloudflare говорит, что ваш сервер отвечает слишком медленно или не отвечает вообще.

Можно попробовать а) отключить проксирование в Cloudflare, подождать пока обновятся DNS, стукнуться на ваш сервер напрямую и посмотреть что получится б) изучить access- и error-логи Nginx - получает ли он вообще запрос и что с ним делает.

Можно как-то избавиться от использования nginx, если на сервере установлен nextcloud, а то уж больно сложно все получается?

Зависит от того, как именно установлен Nextcloud. Nextcloud нередко тоже использует Nginx как фронтенд, но если, например, ставили его через докер, то нужно будет лезть в конфиги Nginx внутри докер-контейнера, а ещё Xray тоже ставить в Docker, или же делать им всем host network чтобы они друг друга видели. Короче, тоже непросто, есть риск что-то разломать или поиметь проблем при обновлениях в будущем.

Сейчас попробовал сделать по третьему варианту, с XTLS-Reality и SNI. Теперь так: XTLS работает, а подключения через WS и gRPS в Некобокс выдают такую ошибку: [[VLESS] VLESS-Websocket-p9r2h9m3] test error: Get "http://cp.cloudflare.com/": x509: cannot validate certificate for ***.**.***.** because it doesn't contain any IP SANs (звездочками закрыл IPшник). Какая-то ошибка сертификата? Я использую внутренний, сгенерированный от СF.

Нужно проверить, что ваш домен резовлится в адреса балансеров Cloudflare, а не напрямую как есть. Ну и что в конфиге Nekobox в качестве адреса сервера указан именно домен, а не IP-адрес.

Поставил в Nekobox адрес домена вместо IP адреса, теперь пишет так: [[VLESS] VLESS-Websocket-p9r2h9m3] test error: Get "http://cp.cloudflare.com/": websocket: bad handshake: HTTP 525 525 Origin SSL Handshake Error. А с gRPC вот так: [[VLESS] VLESS-gRPC-830sd7op] test error: Get "http://cp.cloudflare.com/": unexpected status: 526 526

Это уже лучше. Теперь Cloudflare ругается, что не может установить TLS-подключение с вашим сервером. Нужно проверять, на каком адресе слушает веб-сервер, правильно ли на нём настроены TLS-сертификаты, что стоит в настройках TLS в панели CF.

Не получается завести... Сертификаты прописывал в конфиге nginx по вашей статье, в панели СF пробовал и внутренний, и самоподписанный сертификат... Одинаковая ошибка, TLS подключение с сервером не устанавливается...

в CF в SSL/TLS → Overview какой режим стоит?

Ещё стоит попробовать постучаться CURL'ом на IPv6-адрес вашего сервера с вашим доменом (если у вас есть IPv6), с verbose logging и отключённой проверкой сертификатов и посмотреть что он выдаст.

Если ни то ни другое не натолкнет на размышления, то без точного конфига Nekobox, Nginx и Xray дальше ничего конкретного сказать не получится, там сотни вариантов могут быть на тему что именно не так.

Режим Full (strict) в панели СF стоит, но я пробовал генерировать и самоподписанный, переключал на просто Full - одинаковый результат.

В общем, ура-ура, после нескольких итераций все завелось и работает вроде. Так и не понял, почему не получалось с самого начала - то ли что-то с сертификатами было, то ли в конфигах я ошибки делал. Настроил по варианту 1 с отдельным IPv6 через СF.

Но: в настройке написано, что надо VLESS inbound через порт 443 - надо на 127.0.0.1 настроить. У меня так не работает, прописал в "listen" IP4 своего сервера. Если настроить в конфиге Xray, чтобы слушал на 127.0.0.1, Некобокс пишет: test error: Get "http://cp.cloudflare.com/": dial tcp ***.**.***.**:443: connectex: No connection could be made because the target machine actively refused. С прописанным айпишником - все запустилось.

И еще, почему-то на клиенте Android VLESS-gRPC/Websocket отказывается работать, при том, что в виндовс-версии все запустилось. Андроид клиент NekoBox пишет что-то типа "exchange6: name error, exchange4: name error". Видимо, что-то в настройках самого клиента, профиль подключения один и тот же, с виндовс-версии.

Но: в настройке написано, что надо VLESS inbound через порт 443 - надо на 127.0.0.1 настроить. У меня так не работает, прописал в "listen" IP4 своего сервера. Если настроить в конфиге Xray, чтобы слушал на 127.0.0.1, Некобокс пишет: test error: Get "http://cp.cloudflare.com/": dial tcp ***.**.***.**:443: connectex: No connection could be made because the target machine actively refused. С прописанным айпишником - все запустилось.

Да, точно, в статье в описании этого пункта была ошибка. Интересно, что вы первый, кто заметил и сообщил.

И еще, почему-то на клиенте Android VLESS-gRPC/Websocket отказывается работать, при том, что в виндовс-версии все запустилось. Андроид клиент NekoBox пишет что-то типа "exchange6: name error, exchange4: name error". Видимо, что-то в настройках самого клиента, профиль подключения один и тот же, с виндовс-версии.

Попробуйте v2rayNG в качестве клиента, может с ним заработает. QR-кодв и ссылки должны быть совместимы.

И ещё один вариант - проверить uTLS. У меня с uTLS выставленным в значение "android" не работало.

Спасибо, поставил v2rayNG, всё завелось, действительно. Клиент там, правда, криво считывает qr-код на Shadowsocks, и через буфер обмена не вбивается почему-то, вручную вбил - работает. Остальные профили - Reality, Vless-gRPC/WS - через QR коды вносятся нормально.

Теперь я практически всесилен и готов к чебурнету, йо хо хо :) Плюсов вам в карму.

Спасибо за твои старания добрый человек ;)

За твои труды на пользу обществу вселенная отплатит тебе, в той или иной форме (но это не точно).

Сохранил все статьи себе в телегу, на случай удаления с хабра. На сегодня такая информация очень ценная.

Да пребудет с тобой сила

Выглядит слишком офигенно, чтобы быть правдой :)

Есть хоть какие-то ограничения? Ну, например, обязателен клиент, а расширения для браузера не существует. Т.е. не получится одновременно работать с одним браузером напрямую, а с другим - "в обход". Впрочем, если клиент можно настроить на разные приложения (кого заворачивать, кого байпасить) - тоже хорошо.

Клиент обязателен, да. Но клиент чаще всего работает как обычный локальный прокси, то есть нет проблем в одном браузере указать его в настройках, а в другом нет, или использовать какое-нибудь расширение типа SwitchyOmega.

Это изумительно!

Эдак я даже клиента terraform.exe смогу завернуть, в то время как остальные приложения продолжат работать напрямую.

О, да! Вполне можно избирательно перенаправлять через буржуиндию.

А как проверить, что правильно все работает? Ну вот gRPC и WS подключение - они же через CF идут, и ip должен показываться Cloudflare, так? А то всякие 2ip.io при проверке показывают ip сервера VPS, или это нормально? Простите за вопросы от чайника... Как убедиться, что подключение точно идет через СF?

Да, нормально, схема применено такая

Клиент->сервер cf->vps->интернет

Интернет->vps->сервер cf->клиент

В общем так и должно быть, ну, т.е. идёт через cloudflare, но а интернет ты выходишь через vps

и ip должен показываться Cloudflare, так

Нет, всегда будет показываться IP вашего сервера. Cloudflare выступает только в роли посредника, пересвлающего трафик между клиентом и вашим сервером туда-обратно, а выход в интернет идёт уже с вашего VPS. Так что сервисы проверки IP будут показывать адрес вашего VPS, так и должно быть.

Как убедиться, что подключение точно идет через СF?

Например, временно остановить на вашем сервере Nginx и Xray, и попробовать открыть домен вашего "сайта" в браузере - вы должны увидеть страницу с ошибкой от Cloudflare.

Или отрезолвить IP-адрес для домена вашего "сайта" (который вы в клиенте вбиваете как адрес подключения к серверу) и проверить его по базам whois - он должен принадлежать Cloudflare.

Здравствуйте неудалось разобраться с настройками застрял в панели 3XU, не понятно какие данные тут заполнить?

в gcore не должны же быть дополнительные сертификаты

Если настраивали по статье (с использованием Nginx), то "Порт IP" (на самом деле это Listen IP, в старой версии кривой перевод) - 127.0.0.1, порт - 8888, serviceName - секретный урл из конфига nginx для gRPC, TLS должен быть отключен, никаких дополнительных сертификатов в X-UI подсовывать не надо.

Для вебсокетов то же самое, только порт 8889, ну и урл другой.

Ну и имейте в виду, что Gcore не поддерживает gRPC, только вебсокеты.

Изображение не загружено

Обывателю трудно все это настроить, вот мои конфиги и настройки, я получаю ошибки при подключении. Не знаю куда копать

Так по какому из вариантов из статьи вы настраиваете? У вас на сервере уже был настреон Reality, раз вы пошли по пути с SNI-прокси?

Если да, то для вебсокетного inbound порт должен быть 8889 (такой как в proxy_pass в конфиге Nginx), и еще раз обращаю внимание, TLS в 3X-UI для этого inbound должен быть выключен.

И не понятен этот пункт «TestChatGRPC» и «TestChatWS» должны совпадать с секретными URL'ами, которые мы потом внесем в конфиг Nginx, какие конкретно urlы имеются ввиду?

те которые в конфиге Nginx следуют за директивой "location".

то есть у вас в конфиге Nginx написано "location /TestChatWS", в конфиге 3X-UI указан этот же адрес, и в клиенте будет он же

короче так и ничего не получилось, пробовал менять порт на 8889 в панели и отключил tls, все равно не подключается, оставлю до лучших времен.

Извините, если этот вопрос уже был, но так много комментариев.

Правильно ли я понял, что нужно два домена: один для Cloudflare, другой для фейкового сайта?

Нет, домен нужен только один.

Здравствуйте еще вопрос, если в gcore, я указал доменное имя второго уровня которое мне предоставил vps и поменял на нем настройки dns в кабинете vps на те которые предоставил gcore, все же правильно? Потому что у меня нету домена и gcore был выбран из-за настройки без домена.

Может доменное имя все-таки третьего уровня? Домены второго уровня обычно за деньги продаются.

А так, судя по тому что вы описали, то да, все правильно (хотя я удивлен, что какие-то хостеры дают возможность менять CNAME для их технических доменов).

Как с устройств WireGuard сети РФ направлять пакеты напрямую по адресу в случае .ru домена, а в других случаях на другой сервер за пределами РФ с XRay с XTLS-Reality. И может ли такая связка оставаться конфидециальной?

Это нужно для работы между устройствами в одной сети и упростить жизнь коллегам по настройке уже WG клиента, а не прокси. Где они могли бы случайно не включить uTLS.

Из вашего текстового описания совершенно не понятно, что вы хотите сделать. Если у клиентов на устройства Wireguard, то они должны подключаться к серверу Wireguard. А значит РКН легко заблокирует такие подключения. Или вы что-то другое имеете в виду?

Нужно обходить блокировки с XRay XTLS-Reality и чтобы устройства видели друг друга внутри vpn. Также устройства должны ходить на .ru доменты напрямую, а на другие домены через прокси XRay.

1 вариант. Как-то использовать связку WG+Xray на одном сервере за РФ;

2 вариант: Использовать еще один сервер на территории РФ для подключения клиентов по WG, а потом на .ru домент идти напрямую или идти на серер с XRay за РФ.

Какой вариант лучше использовать? Есть ли статья с похожей реализацией для связки WG и XRay (либо другого прокси)? И как правильно настроить маршрутизацию?

2 вариант: Использовать еще один сервер на территории РФ для подключения клиентов по WG, а потом на .ru домент идти напрямую или идти на серер с XRay за РФ.

С одной стороны, такое даже будет работать и довольно простое в настройке (особенно со стороны клиентов): на сервере поднимаете WG и sing-box с tun-режимом, и заворачивать весь трафик от WG-клиентов на этот tun-интерфейс (например, создав routing table с правилом, или же через iptables). А там уже sing-box будет смотреть подключения и по правилам маршрутизации передавать их дальше на прокси или выпускать напрямую.
Но есть одно НО: ваше подключение WG внутри РФ по-прежнему останется подключением WG, и есть риск, что рано или поздно оно попадет под бан. Уже сейчас довольно много людей отписывалось, что в моменты обострения у них были проблемы с Wireguard даже до серверов внутри страны.

1 вариант. Как-то использовать связку WG+Xray на одном сервере за РФ;

Вот тут, к сожалению, простых рабочих схем не существует.

Проблем несколько. Во-первых вам надо замаскировать WG-подключение. WG работает через UDP, и это проблема. В теории, UDP-коннекты можно запускать через прокси (и VLESS и Shadowsocks это поддерживают), но по факту, например, через прокси OpenVPN работает в режиме TCP, но не работает в режиме UDP. С WG есть вероятность что тоже не заведется. Ну и плюс настройка клиетов будет нетривиальная (надо будет настраивать всю связку), а на мобильных устройствах так вообще жопа.

Более хороший вариант - для маскировки VPN вместо прокси использовать Cloak. Он умеет в TCP и UDP. Кто-то в интернетах пишет что WG заворачивается в Cloak и работает без проблем, кто-то пишет что не работает :) Точно работающий вариант - OpenVPN TCP в Cloak или OpenVPN TCP в Shadowsocks - так, например, работают клиенты у Amnezia VPN.

Но тут встает другая проблема - вам надо трафик до ресурсов в РФ выпускать сразу напрямую. Мне не встречалось работающих схем, которые бы умели роутить трафик по GeoIP (или более того, по анализу SNI) из WireGuard или OpenVPN. Так что или придется наворачивать что-то с BGP, или из WG/OpenVPN снова заворачивать трафик на Sing-box и разруливать уже там. Короче говоря, для ваших требований простого решения нет, только наворачивать очень сложные в настройке конструкции с риском что на каждом этапе что-нибудь может сломаться.

Здравствуйте, доброго дня! У меня вопрос по cdn Gcore. В статье написано что gcore можно использовать для тех кто не хочет покупать еще и домен и можно обойтись без него, но в настройках нужно указать домен и поменять cname, получается без домена ну никак?

Custom domain — тут укажите ваш домен, который вы будете использовать. Не забудьте включить галочку «Enable HTTPS» и выбрать «Get free Let's Encrypt certificate». Нажимаем Confirm чтобы идти дальше. После этого Gcore скажет вам, какое именно значение надо прописать в поле CNAME для вашего домена — это будет какой‑то адрес, скорее всего заканчивающийся на *.gcdn.co:

Вы кажется не совсем внимательно прочитали:

Но у gCore есть огромное преимущество — для работы через него не обязательно делегировать на него домен, достаточно просто CNAME‑записи — в теории, можно использовать даже DynDNS‑сервисы с бесплатными доменами, которые позволяют указывать CNAME.

То есть если у вас нет купленного домена, вам надо найти DynDNS-сервис, позволяющий редактировать CNAME-записи, и использовать его бесплатный домен.

Немного оффтоп. Хотел спросить у проходимцев возникали у кого проблемы с регистрацией на gcore com? При обыкновенной попытке выходит ответ: We’re sorry. Gcore services are not currently available in your location
При реге из под vless - something went wrong

Здравствуйте, вы можете скинуть скрин с правильными настройками клиента, уже всю голову сломал, не работает, серер настроен по этой статье (Bleeding-edge обход блокировок с полной маскировкой: настраиваем сервер и клиент XRay с XTLS-Reality быстро и просто) , один раз трафик даже вроде прошел через gcore, в статистике видно, но все равно не понятно как нормально клиент заставить работать.

Эм, в статье есть скриншоты с примером настроек Nekobox для вебсокетов и gRPC.

Задержки 1100-1800 ms для Нидерландского сервера это норм для XTLS-Reality?

Скорость не падает. Пробовал и на Финском сервере, задержки те же. Устанавливал x-ui через docker.

Да, норм. Два важных отличия от других технологий: 1) в отличие от VPN, где подключение к VPN-серверу устанавливается один раз и все, в случае с прокси, на каждое исходящее подключение из клиентского софта устанавливается новое подключение к прокси-серверу (если только не используется мультиплексирование) 2) поскольку через прокси невозможно послать ICMP-пинг, большинство клиентов меряют задержку не пингом, а выполнением HTTP-запроса.

Вот и считайте: когда вы запускаете тест, сначала устанавливается TCP-соединение с прокси-сервером (уже как минимум один, а то и два round-trip). Потом поверх него происходит TLS-хендшейк (ещё один round-trip), и в процессе него прокси-сервер ещё устанавливает TCP-соединение с reality-dest сервером и запрашивает у него сертификат. Потом прокси посылает запрос на установление TCP-соединения с тем сервером, который используется для теста. Потом, если URL указан как HTTPS, происходит ещё TLS-хендшейк с ним. Потом клиент делает HTTP-запррч и ждёт получения ответа. И только после ответа вы видите результат теста, и "задержка" - это суммарное время всего вышеописанного процесса.

Доброго дня, нашла ошибку у вас в настройках, исправьте пожалуйста.

Изображение не загружено

Там нет ошибки. Нельзя слушать на IP VPS на порту 8443. На IP VPS слушать должен SNI-proxy, конфиг которого описан в статье дальше, а этот блок server слушать должен именно на локалхосте, его нельзя светить наружу.

Поясните пожалуйста:

"В первую очередь, редактируем ваш конфиг XRay, сделаем так, чтобы его VLESS/XTLS‑Vision inbound слушал на локалхосте на порту 8443:

"listen": "127.0.0.1",

"port": 8443

"

Это в какой секции исправлять, в

{

"listen": "127.0.0.1",

"port": 8888,

"protocol": "vless",

"tag": "grpc",

"settings": {

"clients": [

{

"id": "_UUID_вашего_пользователя"

}

],

"decryption": "none"

},

"streamSettings":

{

"network": "grpc",

"grpcSettings":

{

"serviceName": "TestChatGRPC"

}

и т. д.

Где этот самый VLESS/XTLS‑Vision inbound ?

Исправлять в секции "inbounds":

если у вас ее нет, конфиг неполный

В каком именно inbound? Вы не могли бы текст этого инбаунда привести?

В том inbound'е, который у вас уже существует после настройки по одной из предыдущих статей.

Где этот самый VLESS/XTLS‑Vision inbound

Это только вы можете знать, зависит от того как именно вы настраивали сервер до этого.

Я настраивал по "Bleeding-edge обход блокировок с полной маскировкой: настраиваем сервер и клиент XRay с XTLS-Reality быстро и просто". Нигде VLESS/XTLS‑Vision inbound нет. Есть только:

"inbounds": [

{

"port": 23,

"tag": "ss",

"protocol": "shadowsocks",

"settings": {

"method": "2022-blake3-aes-128-gcm",

"password": "aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbb",

"network": "tcp,udp"

}

},

{

"port": 443,

"protocol": "vless",

"tag": "vless_tls",

"settings": {

"clients":[

{

"id": "4c3fe585-ac09-41df-b284-70d3fbe18884",

"email": "user1@myserver",

"flow": "xtls-rprx-vision"

}

],

"decryption": "none"

},

Который из них VLESS/XTLS‑Vision inbound?

Наверное, второй?

Посмотрите внимательнее, у вас во втором inbound написано "protocol": "vless", "flow": "xtls-rprx-vision". Думаю, ответ очевиден.

То есть должно быть так:

{

"listen": "127.0.0.1",

"port": 8443

"protocol": "vless",

"tag": "vless_tls",

"settings": {

"clients":[

{

"id": "4c3fe585-ac09-41df-b284-70d3fbe18884",

"email": "user1@myserver",

"flow": "xtls-rprx-vision"

}

],

"decryption": "none"

},

?

Да.

Прочитайте пожалуйста статьи, автор и так все непонятные моменты подсветил

Да я читаю. Иксрей я настроил по предыдущей статье. Хочу расширить до cdn, а то тормозить интеонет начал, а тут непонятно какой инбаунд редактировать?

а то тормозить интеонет начал,

через CDN обычно работает ощутимо медленнее, чем напрямую, поэтому на вашем месте я бы не надеялся.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Публикации

Читают сейчас

Истории

Идём на «Импульс Т1» по дороге из жёлтого кирпича
Как стать супергероем
Рейтинг IT-брендов работодателей 2023
Активность найма в 3 квартале 2023
Топ-7 годных статей из блогов компаний
Сколько тратят в IT: сеньор бэкендер
Перевернуть календарь и добавить событие

Работа